package slic.mail;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;

import slic.model.Deportista;
import slic.model.Escuela;
import slic.service.EscuelaLocalServiceUtil;

import com.liferay.mail.service.MailServiceUtil;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.mail.MailMessage;
import com.liferay.portal.model.User;

public class RevisionInscripcionMailSender {
	
	private static Log _log = LogFactoryUtil.getLog(RevisionInscripcionMailSender.class);
	
	private User reiniciador;
	private Deportista deportistaARevisar;
	private String comment;
	
	private RevisionInscripcionMailSender(User reiniciador, Deportista deportistaARevisar) {
		this.reiniciador = reiniciador;
		this.deportistaARevisar = deportistaARevisar;
		this.comment = deportistaARevisar.getInscripcionStatusComment();
	}
	
	private String getBody() throws Exception {
		StringBuilder body = new StringBuilder();
		
		body.append("La inscripción rechazada ha sido reiniciada, el " + 
					"deportista vuelve a estar Pendiente de Habilitación: \n");
		body.append(String.format("Nombre: %s\nDNI: %s\n\n", 
								 deportistaARevisar.getNombre(), 
								 deportistaARevisar.getDni()));
		body.append(String.format("Vuelto a Pendiente de Habilitación por: %s (%s)", 
								  reiniciador.getFullName(), 
								  reiniciador.getEmailAddress()));		
		body.append("\n\nObservaciones:\n\n");
		body.append(comment);
		
		return body.toString();
	}	
	
	private String getSubject() {
		return String.format("Juegos Intercolegiales - Inscripción reiniciada de DNI %s", 
							 deportistaARevisar.getDni());
	}
	
	private void sendMail(InternetAddress[] destinations) {
	
		// TODO: Sacarlo de la configuracion del portlet
		String fromName = "Inscripciones San Luis Intercolegiales 2013";
		String fromAddress = "inscripciones.slic2013@sanluis.gov.ar";
		
		String subject = getSubject();    
		String body;
		try {
			body = getBody();
		} catch (Exception e1) {
			_log.trace("Error getting Mail Body", e1);
			return;
		}
	
        InternetAddress from;
		try {
			from = new InternetAddress(fromAddress, fromName);
		} catch (UnsupportedEncodingException e) {
			_log.trace("From Address is not valid", e);
			e.printStackTrace();
			return;
		}
   
        MailMessage mailMessage = new MailMessage();
        mailMessage.setFrom(from);
        mailMessage.setBody(body);
        mailMessage.setSubject(subject);
        mailMessage.setTo(destinations);
        
        MailServiceUtil.sendEmail(mailMessage);
        
	}
	
	public static void sendRevisionMail(User reiniciador, Deportista deportistaARevisar, User prevUser) {
		
		RevisionInscripcionMailSender sender = new RevisionInscripcionMailSender(reiniciador, deportistaARevisar);
		List<InternetAddress> direcciones = new ArrayList<InternetAddress>();
		
		if (prevUser.getEmailAddress() != null && !prevUser.getEmailAddress().isEmpty()) {
			try {
				direcciones.add(new InternetAddress(prevUser.getEmailAddress(), prevUser.getFullName()));
			} catch (UnsupportedEncodingException e) {
				_log.error("Error agregando direccion: " + prevUser.getEmailAddress());
			}
		}			
		
		Escuela escuela = null;
		try {
			escuela = EscuelaLocalServiceUtil.fetchEscuela(deportistaARevisar.getEscuelaId());
		} catch (SystemException e1) {
			_log.error("Error al buscar la escuela: " + deportistaARevisar.getEscuelaId());
		}		
		
		if (escuela != null && 
			escuela.getEmails() != null && 
			!escuela.getEmails().isEmpty()) {
			for (String email: escuela.getEmails().split(";")) {
				try {
					direcciones.add(new InternetAddress(email.trim(), escuela.getNombre()));
				} catch (UnsupportedEncodingException e) {
					_log.error("Error agregando direccion: " + email.trim());
				}		
			}
		}
		
		sender.sendMail(direcciones.toArray(new InternetAddress[direcciones.size()]));
		_log.info(String.format("Mail de revisión (DNI: %s) enviado", 
								deportistaARevisar.getDni()));
		
	}
	
}
